﻿using RS.Echarts.Models.XAxis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RS.Echarts.Models
{
    /// <summary>
    /// 雷达图坐标系，用于在图表中展示多维数据，每个雷达图坐标系可以包含多个指标轴（indicator）。
    /// </summary>
    public class Radar
    {
        /// <summary>
        /// 组件ID。默认不指定。指定则可用于在option或者API中引用组件。
        /// </summary>
        public string? Id { get; set; }

        /// <summary>
        /// 是否显示雷达图坐标系。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 雷达图坐标系的zlevel值。zlevel用于Canvas分层，不同zlevel值的图形会放置在不同的Canvas中，Canvas分层是一种常见的优化手段。
        /// 我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的Canvas会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
        /// zlevel大的Canvas会放在zlevel小的Canvas的上面。
        /// </summary>
        public int ZLevel { get; set; }

        /// <summary>
        /// 组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
        /// z相比zlevel优先级更低，而且不会创建新的Canvas。
        /// </summary>
        public int Z { get; set; }

        /// <summary>
        /// 雷达图坐标系的中心（圆心）坐标，数组的第一项是横坐标，第二项是纵坐标。
        /// 支持设置成百分比，设置成百分比时第一项是相对于容器宽度，第二项是相对于容器高度。
        /// 使用示例：
        /// // 设置成绝对的像素值
        /// center: [400, 300]
        /// // 设置成相对的百分比
        /// center: ['50%', '50%']
        /// </summary>
        public float[]? Center { get; set; }

        /// <summary>
        /// 雷达图坐标系的半径。可以为如下类型：
        /// number：直接指定外半径值。
        /// string：例如，'20%'，表示外半径为可视区尺寸（容器高宽中较小一项）的20%长度。
        /// Array.<number|string>：数组的第一项是内半径，第二项是外半径。每一项遵从上述number、string的描述。
        /// </summary>
        public object? Radius { get; set; }

        /// <summary>
        /// 起始角度，默认为90度，即圆心的正上方。0度为圆心的正右方。
        /// </summary>
        public int StartAngle { get; set; }

        /// <summary>
        /// 结束角度，默认为null，表示一整个圆。从v5.5.0开始支持。
        /// </summary>
        public int? EndAngle { get; set; }

        /// <summary>
        /// 雷达图坐标系的名称。
        /// </summary>
        public string? Name { get; set; }

        /// <summary>
        /// 雷达图坐标系名称的文字样式。
        /// </summary>
        public TextStyle NameTextStyle { get; set; }

        /// <summary>
        /// 雷达图坐标系名称与轴线之间的距离。
        /// </summary>
        public int NameGap { get; set; }

        /// <summary>
        /// 雷达图坐标系的背景色，默认透明。
        /// 颜色可以使用RGB表示，比如'rgb(128, 128, 128)'，如果想要加上alpha通道，可以使用RGBA，比如'rgba(128, 128, 128, 0.5)'，也可以使用十六进制格式，比如'#ccc'。
        /// </summary>
        public string? BackgroundColor { get; set; }

        /// <summary>
        /// 雷达图坐标系的边框颜色。支持的颜色格式同backgroundColor。
        /// </summary>
        public string? BorderColor { get; set; }

        /// <summary>
        /// 雷达图坐标系的边框线宽。
        /// </summary>
        public int BorderWidth { get; set; }

        /// <summary>
        /// 雷达图坐标系的形状，可选'circle'（圆形，默认）或'polygon'（多边形）。
        /// </summary>
        public string? Shape { get; set; }

        /// <summary>
        /// 雷达图坐标系的提示框组件特定设置。
        /// 提示框组件可以设置在多种地方：
        /// 可以设置在全局，即tooltip。
        /// 可以设置在坐标系中，即grid.tooltip、polar.tooltip、single.tooltip、radar.tooltip。
        /// 可以设置在系列中，即series.tooltip。
        /// 可以设置在系列的每个数据项中，即series.data.tooltip。
        /// </summary>
        public Tooltip? Tooltip { get; set; }

        /// <summary>
        /// 雷达图坐标系的指示器配置项，用于配置坐标轴指示器的样式和行为。
        /// </summary>
        public AxisPointer? AxisPointer { get; set; }

        /// <summary>
        /// 雷达图坐标系的分割区域相关设置，默认不显示。
        /// </summary>
        public SplitArea? SplitArea { get; set; }

        /// <summary>
        /// 雷达图坐标系的角度轴配置项。
        /// </summary>
        public AngleAxis? AngleAxis { get; set; }

        /// <summary>
        /// 雷达图坐标系的半径轴配置项。
        /// </summary>
        public RadiusAxis? RadiusAxis { get; set; }

        /// <summary>
        /// 雷达图坐标系的指标轴数组，用于定义雷达图中的各个维度指标。
        /// </summary>
        public List<Indicator>? Indicator { get; set; }
    }


    
    /// <summary>
    /// 雷达图坐标系的分割区域相关设置类。
    /// </summary>
    public class SplitArea
    {
        /// <summary>
        /// 是否显示分割区域。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 分割区域的面积样式配置。
        /// </summary>
        public AreaStyle? AreaStyle { get; set; }
    }

    /// <summary>
    /// 区域样式配置类，用于设置如雷达图坐标系分割区域等的填充颜色、透明度等样式。
    /// </summary>
    public class AreaStyle
    {
        /// <summary>
        /// 填充颜色，可以是单一颜色，例如常见的RGB格式（如'rgb(128, 128, 128)'）、带有透明度的RGBA格式（如'rgba(128, 128, 128, 0.5)'）以及十六进制格式（如'#ccc'）；也可以是颜色数组，用于设置不同区域的不同颜色，以实现更丰富的视觉效果。
        /// 例如设置为两个颜色的数组时，会以交替的方式呈现不同颜色的区域。
        /// </summary>
        public object? Color { get; set; }

        /// <summary>
        /// 透明度，取值范围在0（完全透明）到1（完全不透明）之间，用于调整区域的透明程度，可根据需要让区域更突出或者更隐晦一些，以配合图表整体的视觉效果。
        /// </summary>
        public float? Opacity { get; set; }
    }

    /// <summary>
    /// 雷达图坐标系的指标轴配置项，用于定义雷达图中的各个维度指标。
    /// </summary>
    public class Indicator
    {
        /// <summary>
        /// 指标轴的名称，用于在图表中显示该维度的标识。
        /// </summary>
        public string? Name { get; set; }

        /// <summary>
        /// 指标轴的最大值，用于确定该维度数据的范围上限，影响雷达图的显示比例。
        /// </summary>
        public double? Max { get; set; }

        /// <summary>
        /// 指标轴的最小值，用于确定该维度数据的范围下限，影响雷达图的显示比例。如果不设置，会根据数据自动计算。
        /// </summary>
        public double? Min { get; set; }

        /// <summary>
        /// 指标轴的颜色，用于设置该维度在雷达图中的线条颜色或区域填充颜色（如果适用），可以增强图表的可视化效果和区分度。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 指标轴的名称文字样式配置，用于自定义指标轴名称的显示样式，如字体、颜色、大小等。
        /// </summary>
        public TextStyle? NameTextStyle { get; set; }

        /// <summary>
        /// 指标轴的轴线相关设置，用于配置轴线的样式，如显示与否、线条样式、标记等。
        /// </summary>
        public AxisLine? AxisLine { get; set; }

        /// <summary>
        /// 指标轴的刻度相关设置，用于配置刻度的样式和显示方式，如刻度线长度、样式、自定义刻度值等。
        /// </summary>
        public AxisTick? AxisTick { get; set; }

        /// <summary>
        /// 指标轴的刻度标签相关设置，用于配置刻度标签的样式和显示方式，如字体、颜色、旋转角度、格式化等。
        /// </summary>
        public AxisLabel? AxisLabel { get; set; }

        /// <summary>
        /// 指标轴的分隔线相关设置，用于配置分隔线的样式，如显示与否、线条样式等。
        /// </summary>
        public SplitLine? SplitLine { get; set; }

        /// <summary>
        /// 指标轴的次分隔线相关设置，用于配置次分隔线的样式，次分隔线会对齐次刻度线（如果有）。
        /// </summary>
        public MinorSplitLine? MinorSplitLine { get; set; }

        /// <summary>
        /// 指标轴的分隔区域相关设置，用于配置分隔区域的样式，如显示与否、区域填充样式等。
        /// </summary>
        public SplitArea? SplitArea { get; set; }
    }

}